//
//  main.m
//  OC_05_数组_字典和集合
//
//  Created by wyx on 16/3/1.
//  Copyright © 2016年 Apon. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Contact.h"
#import "AddressBook.h"
#import "AddressBookV2.h"
int main(int argc, const char * argv[]) {
#pragma mark - 知识点1. NSArray 不可变数组
    /** 数组是一个有序集合, 只能存放对象类型. */
    
    /** 不可变数组: 数组创建好之后, 数组内的元素不能发生改变. */

    /** 初始化 */
#if 0
    NSArray *arr1 = [[NSArray alloc] initWithObjects:@"Tom",@"zhangsan",@"lisi", nil];//数组中是NSString对象
    NSArray *arr2 = [[NSArray alloc] initWithObjects:@2,@20, nil];//数组中是 NSNumber 对象
    NSArray *arr3 = [[NSArray alloc] initWithObjects:arr1,arr2, nil];
    NSLog(@"arr3%@",arr3);
    NSArray *arr4 = [[NSArray alloc] initWithObjects:arr1, nil];
    NSLog(@"arr4%@",arr4);
#endif
    /** 便利构造器 */
#if 0
    NSArray *arr = [NSArray arrayWithObjects:@"ak",@"afjgy",@"rsyt", nil];
    NSArray *arr2 = [NSArray arrayWithObjects:arr];
    
#endif
    /** 字面量 */
#if 0
    NSArray *arr = @[@"zhjsk",@"skuerh",@"bfj"];
    NSArray *arr2 = @[arr];
    NSArray *arr3 = @[@[@"szdkfj",@"set"],@[@"dgr",@"sef"]];
#endif
    /** 字面量方式获取数组元素 */
#if 0
    NSArray *arr = @[@"zhang",@"sfi",@"sfh"];
    NSString *str1 = arr[1];
    NSLog(@"str1 = %@",str1);
#endif
    /** 获取数组元素个数 */
#if 0
    NSArray *arr = @[@"zjhfk",@"ser",@"kdg"];
    
    NSLog(@"count:%ld",arr.count);
#endif
    /** 获取数组中指定下标对应的元素 */
#if 0
    NSArray *arr = @[@"ksudf",@"ksd",@"kshf"];
    NSString *str1 = [arr objectAtIndex:1];
    
#endif
    /** 用来判断数组中是否包含某一个给定的对象 */
#if 0
    NSArray *arr = @[@"sje",@"seg",@"serr"];
    BOOL a = [arr containsObject:@"serr"];
    NSLog(@"%d",a);
#endif
    /** 获取数组元素对应的索引 */
#if 0
    NSArray *arr = @[@"sf",@"segds",@"set"];
    NSInteger index = [arr indexOfObject:@"set"];
    NSLog(@"%ld",index);
    
#endif
    /** 按照给定的字符串进行截取，将截取的多段字符串放入数组中 */
    /** 练习: 有一个字符串(www.lanou3g.com)，通过.进行分割. */
#if 0
    NSString *str = @"www.lanou3g.com";
    NSArray *str1 = [str componentsSeparatedByString:@"."];
    NSLog(@"%@",str1);
#endif
    /** 将数组中的元素按照给定的字符串格式拼接成一个完整的字符串对象 */
    /** 练习: 有一个数组，通过&将所有元素拼接成一个字符串. */
    /** 练习: 有如下一个数组，@[@“type = iOS", @"Device = iPhone", @"count = 11344115@163.com", @"password = 12345”]，将其中的内容用”&"符号拼接成一个字符串. */
#if 0
    
    NSArray *arr = @[@"type = iOS", @"Device = iPhone", @"count = 11344115@163.com", @"password = 12345"];
    NSString *newStr = [arr componentsJoinedByString:@"&"];
    NSLog(@"%@",newStr);
    
#endif
    /** 练习: 存在如下的字符串，将其中的图片的网址提取出来。
     “http://www.imanhua.com/Cover/2011-10/hyrz.jpg&http://www.imanhua.com/Cover/2011-09/op.jpg&http://www.imanhua.com/Cover/2012-04/yjdwb.jpg */
#if 0
    NSString *str = @"http://www.imanhua.com/Cover/2011-10/hyrz.jpg&http://www.imanhua.com/Cover/2011-09/op.jpg&http://www.imanhua.com/Cover/2012-04/yjdwb.jpg";
    NSArray *arr = [str componentsSeparatedByString:@"&"];
    NSLog(@"%@",arr);
    
#endif
#pragma mark - 知识点2. NSMutableArray 可变数组
    
    
    /** 初始化 */
#if 0
    NSMutableArray *mArr = [[NSMutableArray alloc] initWithObjects:@"fs",@"sf", nil];
    NSMutableArray *mArr2 = [[NSMutableArray alloc] initWithCapacity:20];
    NSMutableArray *mArr3 = [[NSMutableArray alloc] init];//初始化为空
#endif
    /** 便利构造器 */
#if 0
    NSMutableArray *mArr = [NSMutableArray array];
    NSMutableArray *mArr2 = [NSMutableArray arrayWithCapacity:20];
    
#endif
    /** 字面量 */
#if 0
    NSMutableArray *mArr = @[@"sfgs",@"zsfd",@"xfg"].mutableCopy;
#endif
    /** 数组中添加一个对象 */
#if 0
    NSMutableArray *mArr = [NSMutableArray arrayWithCapacity:20];
    NSString *str = @"skjfk";
    [mArr addObject:str];
    NSLog(@"%@",mArr);
    [mArr addObject:@"sff"];
    NSLog(@"%@",mArr);
    //获取第一个对象.
    NSString *first = [mArr firstObject];
    NSString *last = [mArr lastObject];
    NSLog(@"%@",first);
    NSLog(@"%@",last);
    
#endif
    /** 数组中指定位置插入一个对象 */
#if 0
    NSMutableArray *mArr = @[@"sdf",@"sfe"].mutableCopy;
    [mArr insertObject:@"se" atIndex:1];
    NSLog(@"%@",mArr);
    
#endif
    /** 数组中移除一个对象 */
#if 0
    NSMutableArray *mArr = @[@"zhan",@"Lisi",@"sf"].mutableCopy;
    [mArr removeObject:@"sf"];//删除所有 sf对象
    [mArr removeObjectAtIndex:2];//删除下标对象
#endif
    /** 移除数组中最后一个对象 */
#if 0
    NSMutableArray *mArr = @[@"zhan",@"Lisi",@"sf"].mutableCopy;
    [mArr removeLastObject];
    NSLog(@"%@",mArr);
    
#endif
    /** 移除数组中所有的元素 */
#if 0
    NSMutableArray *mArr = @[@"zhan",@"Lisi",@"sf"].mutableCopy;
    [mArr removeAllObjects];
#endif
    /** 数组中移除指定位置的元素 */
    //index
    /** 使用指定的对象替换指定位置的对象 */
#if 0
    NSMutableArray *mArr = @[@"zhan",@"Lisi",@"sf"].mutableCopy;
    [mArr replaceObjectAtIndex:0 withObject:@"ujr"];
    NSLog(@"%@",mArr);

    /** 交换指定的两个下标对应的对象 */
    [mArr exchangeObjectAtIndex:0 withObjectAtIndex:1];
    NSLog(@"%@",mArr);
#endif
    /**
     * 练习: 定义一个数组完成以下操作
     (1)向数组中添加三个名字。
     (2)从数组中查找指定的名字，并且用另外一个名字替换该姓名。
     (3)删除指定的名字。
     */
#if 0
    NSMutableArray *mArr = @[@"shfjk",@"sf",@"dsfv"].mutableCopy;
    NSInteger a = [mArr indexOfObject:@"sf"];
    [mArr replaceObjectAtIndex:a withObject:@"sdg"];
    NSLog(@"%@",mArr);
#endif
#pragma mark - 知识点3. NSDictionary 不可变字典
    
    /**
     * 字典是一个无序的集合，用来存储具有一一对应关系的数据。
     * 字典中存储的每一个对象都是一对键值对，键值对包含两个部分key和value，key与value的值都是对象类型。
     * 对于每一对key－value称为一个条目(Entry)。-
     */
    
    /** 初始化 */
#if 0
    NSDictionary *dic = [[NSDictionary alloc] initWithObjectsAndKeys:@"wyx",@"name",@20,@"age",@"male",@"sex", nil];
    NSLog(@"%@",dic);
    
#endif
    /** 便利构造器 */
#if 0
    NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"tom",@"name"@"20",@"age",@"male",@"sex", nil];
    NSLog(@"%@",dic);
#endif
    /** 字面量 */
#if 0
    NSDictionary *dic = @{
                          @"name":@"zhangsan",
                          @"age":@"20",
                          @"sex":@"male"
                          };
    NSLog(@"%@",dic);
    /** 获取字典中键值对的个数 */
    //API count
    /** 获取字典中所有的键 */
    //API allKeys,返回值数组
    /** 获取字典中所有的值 */
    //API allValues,返回值数组
    /** 根据键获得对应的值 */
    //先用 objectForKey  还有 valueForKey
    NSString *str = [dic objectForKey:@"name"];
    NSLog(@"%@",str);
#endif
    
    
#pragma mark - 知识点4. NSMutableDictionary 可变字典
    
    /** 初始化 */
#if 0
    NSMutableDictionary *mDic = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"Tom",@"name",@"20",@"age", nil];
    NSMutableArray *mDic2 = [[NSMutableArray alloc] initWithCapacity:20];
#endif
    /** 便利构造器 */
#if 0
    NSMutableDictionary *mDic3 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"Tom",@"name",@"20",@"age", nil];
    NSMutableDictionary *mDic4 = [NSMutableDictionary dictionary];//空字典
#endif
    /** 字面量 */
#if 0
    NSMutableDictionary *mDic5 = @{@"name":@"tom",
                                   @"age":@"20"
                                   }.mutableCopy;
    /** 字典中添加新的键值对以或者修改某一对键值对 */
    [mDic5 setObject:@"male" forKey:@"sex"];
    NSLog(@"mDic:%@",mDic5);
    /** 移除指定的键对应的键值对 */
    [mDic5 removeObjectForKey:@"age"];
    NSLog(@"mDic:%@",mDic5);
    /** 移除字典中所有的键值对 */
    [mDic5 removeAllObjects];
    NSLog(@"mDic:%@",mDic5);
#endif
    /**
     * 练习: 完成以下需求:
     1、定义联系人类Contact。实例变量：姓名(拼音，首字母大写)、性别、电话号码、住址、分组名称、年龄。方法：自定义初始化方法(姓名、电话号码)、显示联系人信息。(用来存放联系人)
     定义一个通讯录类(AddBook),实例变量:(用来存放联系人,分组管理联系人,分组名为26个大写的英文字母)
     2、在main.m中定义字典，分组管理所有联系人。分组名为26个大写的英文字母。
     3、可以添加联系人对象，如果姓名或电话号码为空，添加失败。添加联系人到匹配的分组。
     4、删除某个分组的全部联系人。
     */
#if 0
    //创建通讯录对象
    AddressBook *ab = [[AddressBook alloc] init];
    //创建联系人对象
    Contact *con1 = [Contact contactWithName:@"wyx" sex:@"male" number:7339 addres:@"sef" nameOfGroup:@"A" age:20];
    Contact *con2 = [Contact contactWithName:@"ayx" sex:@"male" number:7345 addres:@"sef" nameOfGroup:@"A" age:20];
    Contact *con3 = [Contact contactWithName:@"byx" sex:@"male" number:7347 addres:@"sef" nameOfGroup:@"A" age:20];
    //Contact *con4 = [Contact contactWithName:@"cyx" sex:@"male" number:7439 addres:@"sef" nameOfGroup:@"A" age:20];
    //Contact *con5 = [Contact contactWithName:@"dyx" sex:@"male" number:7399 addres:@"sef" nameOfGroup:@"A" age:20];
    //通讯录调方法
    [ab addContact1:con1];
    [ab addContact1:con2];
    [ab addContact1:con3];
    //NSLog(@"%@",ab);
    [ab viewAllContact];
    
//    NSArray * arrayKey = [[NSArray alloc]initWithObjects:@"A",@"B",@"C",@"D",@"E",@"F",@"G",@"H",@"I",@"J",@"K",@"L",@"M",@"N",@"O",@"P",@"Q",@"R",@"S",@"T",@"U",@"V",@"W",@"X",@"Y",@"Z",@"null", nil];
//    /** 声明一个字典 */
//    NSDictionary *conDic = [[NSMutableDictionary alloc] initWithCapacity:[arrayKey count]];
//    /** 遍历 Key */
//    for (NSString *p in arrayKey) {
//#pragma mark --- 这个是字典 -数组-数组-字典的嵌套
//        //声明一个空的数组，用于存放字典的value
//        NSMutableArray *mFirstArray = @[con3,con2].mutableCopy;
//        //现在我想向mFirstArray中添加一个字典
//        //将mFirstArray 和arrayKey（即是p）加入到字典（conDic）中
//        [conDic setValue:mFirstArray forKey:p];
//    }
//    NSLog(@"%@",conDic);
    
#endif
    
    
#pragma mark - 知识点5. NSSet 不可变集合
    
    /**
     * 互异性(唯一性)  集合中不能够存在两个相同的对象。
     * 无序性  集合中的对象没有顺序，先添加的对象不一定在集合中的第一个位置，后添加的也不一定在最后的位置。
     * 多用于重用池, 执行效率比数组高, 且可以避免重复元素
     
     */
    
    /** 初始化 */
#if 0
    NSSet *set  =[[NSSet alloc] initWithObjects:@"sadf",@"efd",@"we", nil];
    NSLog(@"%@",set);
#endif
    
    /** 便利构造器 */
#if 0
    NSSet *set  = [NSSet setWithObjects:@"dsfs",@"we",@"sf",nil];
    NSLog(@"%@",set);

    /** 获取集合中对象的个数 */
    NSLog(@"%ld",set.count);

    /** 获取集合中所有的对象 */

    NSArray *a = [set allObjects];
    for (NSString *key in a) {
        NSLog(@"%@",key);
    }

    /** 从集合中取出一个对象 */
    NSString *str = [set anyObject];
    NSLog(@"%@",str);
    /** 判断集合中是否包含某一个指定的对象 */
    //BOOL isCon =   [set containsObject:@"zhangsan"];
    /** 没有字面量 */
#endif
    
    
#pragma mark - 知识点6. NSMutableSet 可变集合
    
#if 0    /** 初始化 */
    NSMutableSet *mSet = [[NSMutableSet alloc] initWithObjects:@"sdfg",@"sfdf",@"sgf", nil];
    /** 便利构造器 */
    NSArray *arr = @[@"zhangsan",@"Tom",@"Lisi"];
    NSMutableSet *mSet2 = [NSMutableSet setWithArray:arr];
    NSMutableSet *mSet3 = [NSMutableSet setWithObject:arr];
    NSLog(@"%@",mSet2);
    /** 添加一个对象 */
    [mSet2 addObject:@"zhang"];
    NSLog(@"%@",mSet2);
    /** 移除一个对象 */
    [mSet2 removeObject:@"zhang"];
    NSLog(@"%@",mSet2);
    /** 移除所有对象 */
    [mSet2 removeAllObjects];
#endif
#pragma mark - 知识点7. NSCountedSet 计数集合.
    //创建对象
    NSArray *arr = @[@"zhangsan",@"Tom",@"Lisi",@"zhangsan",@"Tom",@"zhangsan"];
    NSCountedSet *set = [[NSCountedSet alloc] initWithArray:arr];
    NSLog(@"set:%@",set);
    //核心 API 获取对象次数
    NSInteger a = [set countForObject:@"zhangsan"];
    NSLog(@"%ld",a);
    return 0;
}
